package netStudy;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 34255
 * Date: 2024-11-13
 * Time: 21:38
 */
public class UdpEchoServe {
    //把网卡抽象成一个DatagramSocket文件,操作文件就相当于再操作网卡
    private DatagramSocket UdpServe = null;

    public UdpEchoServe(int port) throws SocketException {
        //指定一个端口号创建出UDP套接字Socket，绑定指定的端口号
        UdpServe = new DatagramSocket(port);
    }

    //服务端提供服务
    public void provideServe() throws IOException {
        System.out.println("服务端连接成功");
        //由于不知道客户端会在何时发送请求，只能7*24小时提供服务
        while(true){
            //每次循环就会处理一条客户端发送的请求

            //接收客户端发送的请求，并进行解析

            //创建一个空数据报DatagramPacket实例作为receive()的输出型参数，读取到的内容放置数据报中
            //byte[]数组用来接收读取的数据包内容(二进制数据)，length<=buf[]长度，表示要的字节数大小
            DatagramPacket datagramPacket = new DatagramPacket(new byte[4099],4099);
            //没有接收到客户端的请求回一直阻塞
            UdpServe.receive(datagramPacket);//使用receive()往数据报中填写读取到的请求
            //解析出请求request，getData()用来获取数据报中的内容，getLength()用来获取byte[]数据中实际存储数据的有效长度
            //因为byte[]存储的是二进制内容，通过String的构造方法构造出字符串类型的客户端请求request
            String request = new String(datagramPacket.getData(),0,datagramPacket.getLength());

            //处理请求，计算出响应
            String response = CalculatingResponse(request);

            //给客户端发送响应
            //创建一个DatagramPacket实例，让数据报存储响应内容并返回给客户端一个响应
            //使用getBytes()获取字符串内容并转发为byte[]数组，即二进制内容
            //getSocketAddress()获取到客户端IP及端口号
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,datagramPacket.getSocketAddress());
            UdpServe.send(responsePacket);//send给指定的客户端端口号发送响应

            //打印处理日志
            System.out.println("IP地址：" + datagramPacket.getAddress() + "  端口号：" + datagramPacket.getPort() + "  响应内容：" + request);
        }
    }

    public String CalculatingResponse(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServe serve = new UdpEchoServe(9990);
        serve.provideServe();
    }
}
